Размещение звездочки в Objective-C - PullRequest
53 голосов
/ 09 июля 2009

Я только начал изучать Objective-C, исходя из опыта VB .Net и C # .Net. Я понимаю использование указателя, но в примерах Objective-C я вижу звездочку, размещенную в нескольких разных местах, и ищу, как мог бы, я не смог найти ответ, почему это так. Каждый поиск, который я пытаюсь найти, приводит к всевозможным объяснениям относительно указателей (которые мне действительно не нужны), но ни одного упоминания о причинах / последствиях различных размещений звездочки. Вот несколько примеров, которые я видел:

NSString *string;
NSString * string;
(NSString *) string;
NSString* string;

Что означают эти разные положения звездочки? Я уверен, что это простой ответ, но разочаровывает отсутствие возможности найти его ни в одной учебной и справочной документации Apple, ни в Интернете.

Может кто-нибудь прекратить мои страдания и ответить на этот непонятный вопрос? Спасибо!

Ответы [ 14 ]

3 голосов
/ 09 июля 2009

там на самом деле все равнозначно: указатель на строку nsstring !!

2 голосов
/ 09 июля 2009

1, 2 и 4 эквивалентны и определяют указатель на строку NSString. Мое личное предпочтение - максимально эмулировать K & R, поэтому мне нравится использовать NSString *string;

(NString*)string; хотя и верное утверждение, на самом деле ничего не делает само по себе.

$ cat foo.m
#include <Cocoa/Cocoa.h>

void foo()
{
    NSString *string;

    (NSString*) string;  // doesn't do anything
    42;   // doesn't do anything either
}

$ gcc -Wall -c foo.m
foo.m: In function 'foo':
foo.m:7: warning: statement with no effect
foo.m:8: warning: statement with no effect
0 голосов
/ 05 января 2017

В альтернативах 1, 2 и 4 для компьютера не может быть никаких отличий, но есть другие читатели кода.

Так как объяснения типа https://stackoverflow.com/a/1521382 и https://stackoverflow.com/a/16040884 и https://www.tutorialspoint.com/objective_c/objective_c_pointers.htm используют первую альтернативу:

1. NSString *string;

и всем дополнительным переменным нужна своя звездочка, как в:

NSString *aString, *bString;

Мое скромное предложение заключается в том, что в качестве стандарта мы используем альтернативу 1.

0 голосов
/ 15 июля 2011

в примере кода документации xcode4 вы можете видеть 3. все время, например, в MoveMeView.m

#if 1

- (void)growAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {

#define MOVE_ANIMATION_DURATION_SECONDS 0.15

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:MOVE_ANIMATION_DURATION_SECONDS];
placardView.transform = CGAffineTransformMakeScale(1.1f, 1.1f); 
/*
 Move the placardView to under the touch.
 We passed the location wrapped in an NSValue as the context.
 Get the point from the value, then release the value because we retained it in touchesBegan:withEvent:.
 */
NSValue *touchPointValue = (NSValue *)context;
placardView.center = [touchPointValue CGPointValue];
[touchPointValue release];
[UIView commitAnimations];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...