Передача нулевого объекта в функцию - PullRequest
1 голос
/ 05 августа 2010

Мне было интересно, выполняет ли цель C какую-либо проверку, чтобы определить, равен ли указатель на объект нулю до вызова функции.

Например, скажем, у меня есть

myObject* ptr;

иинициализируйте

ptr = nil;

и вызовите

[self myFunction:ptr];

, где myFunction - моя собственная функция и не проверяет, равен ли объект нулю.Я где-то слышал, что цель C не будет вызывать функцию, если она равна нулю?Верно ли это и будет ли мой код безопасным?

Причина, по которой я спрашиваю, состоит в том, что я реализую универсальное приложение и имею экземпляр UIView, который будет работать только для ipad.Но я делаю много вызовов функций для этого представления, и вместо того, чтобы проверять состояние, чтобы узнать, является ли это ipad перед вызовом функции, было бы здорово, если бы я мог установить представление как nil, если это iphone.

Кроме того, если разработчик интерфейса выделил объект, и я установил указатель на nil, произойдет ли утечка памяти или сборщик узнает об освобождении объекта?

Спасибо

Ответы [ 2 ]

6 голосов
/ 05 августа 2010

Вы всегда можете предоставить метод с аргументом nil, но я думаю, что вы, возможно, неправильно понимаете, это сообщение nil.

MyClass *object = nil;
[object doSomething]; // nothing done, because object is nil

object = [[MyClass alloc] init];
[object doSomething]; // does something, because object points to an instance

Чтобы продемонстрировать предоставление nil в качестве аргумента:

NSMutableDictionary *myDict = [NSMutableDictionary dictionary];
[myDict setObject:@"Value 1" forKey:@"Key 1"];
[myDict setObject:nil forKey:@"Key 1"]; // perfectly valid
// myDict is empty again after setting nil value for "Key 1".

myDict = nil;
[myDict setObject:@"Value 1" forKey:@"Key 1"]; // nothing happens!

В вышеприведенных случаях object и myDict называются & ldquo; получателем & rdquo ;. Когда получатель nil, никакие действия не выполняются. Это сильно отличается от других языков программирования, например, в C ++ следующее недопустимо:

MyClass *object = NULL;
object->doSomething(); // oops, this is not allowed
0 голосов
/ 05 августа 2010

Что касается памяти, если у вас есть объект в файле NIB, а затем в его коде установлено нулевое значение, произойдет утечка памяти. Вы должны освободить объект, а затем установить его на ноль.

В этом случае, возможно, будет хорошей идеей просто создать объект, если это iPad, и оставить переменную равной nil, если это iPhone. Таким образом, вам не нужно иметь дело с какими-либо случайными ссылками, которые могут возникнуть при создании объекта в файле NIB. Это может или не может быть проблемой, но, вероятно, лучше создавать условно, чем уничтожать условно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...